export default {
	// 获取iap通道
	init() {
		return new Promise((resolve, reject) => {
			//使用uni.getProvider来获取通道
			uni.getProvider({
				service: 'payment',
				success: (res) => {
					console.log("【通道iapChannel】", res)
					if (res && res.providers) {
						let iapChannel = res.providers.find((channel) => {
							return (channel.id === 'appleiap')
						})
						//成功之后会返回通道
						resolve(iapChannel)
						return;
					}
					reject(null)
				},
				fail: res => {
					console.log("【获取iap通道失败】", res)
				}
			})
		})
	},

	/**
	 * 获取未关闭的订单
	 * 场景：已成功支付未关闭；发起支付未支付未关闭
	 */
	restore(iapChannel) {
		console.log("【获取未关闭的订单...】")
		return new Promise((resolve, reject) => {
			iapChannel.restoreCompletedTransactions({
				manualFinishTransaction: true,
				username: ''
			}, (res) => {
				resolve(res)
			}, (err) => {
				reject(err);
			})
		});
	},

	// 关闭订单（结束此次支付行为）
	finishTransaction(transaction, iapChannel) {
		console.log("关闭订单")
		return new Promise((resolve, reject) => {
			iapChannel.finishTransaction(transaction, (res) => {
				console.log("【关闭订单成功】", res)
				resolve(res);
			}, (err) => {
				console.log("【关闭订单失败】", err)
				reject(err);
			});
		});
	},

	// 整合：
	getReview(iapChannel) {
		return new Promise((resolve) => {
			//请求是否有已完成未关闭的订单
			this.restore(iapChannel).then(res => {
				//如果有并且状态为已支付则请求关闭并回调给后端
				if (res.length > 0) {
					console.log("【有未关闭的订单】", res)
					//轮询关闭订单
					res.map(item => {
						/**
						 * @transactionState
						 * '0'- 应用商店正在处理的交易
						 * '1'- 一个成功处理的交易
						 * '2'- 一个失败的交易
						 * '3'- 已经购买过该商品
						 * '4'- 在队列中，但其最终状态为等待外部操作（如“请求购买”）的交易
						 */
						// 如果状态为已完成的状态
						if (item.transactionState == '1') {
							resolve(item)
						} else {
							// 状态为1的，需要等通知服务端后关闭
							this.finishTransaction(item, iapChannel)
						}
					})
				} else {
					console.log("【没有未关闭订单】")
				}
			})
		})
	},

	/**
	 * 请求苹果档位列表
	 * 调用ID为“appleiap”的PaymentChannel对象的requestOrder方法，像Appstore请求有效的商品详情。
	 * 注意：IAP支付必须在调用payment.request方法之前，调用requestOrder方法，否则调用payment.request将会报错。
	 */
	requestOrder(iapChannel, productIds) {
		return new Promise((resolve, reject) => {
			iapChannel.requestOrder(productIds, (orderList) => { //必须调用此方法才能进行 iap 支付
				console.log('下单成功: ' + JSON.stringify(orderList));
				resolve(orderList)
			}, (e) => {
				console.log('下单失败: ' + JSON.stringify(e));
				uni.showToast({
					icon: 'none',
					title: '当前环境不支持苹果内购支付'
				})
				reject(e)
			});
		})
	},

	/**
	 * 整合以上步骤
	 * productIds: 内购商品id
	 * id：标识，回传给服务端
	 * @param {Object} iapChannel 通道信息
	 * @param {Object} productId 内购商品id
	 * @param {Object} orderId  订单id
	 */
	requestPayment(iapChannel, productId, orderId) {
		return new Promise((resolve, reject) => {
			console.log("内购参数 iapChannel---", iapChannel)
			console.log("内购参数 productId---", productId)
			console.log("内购参数 orderId---", orderId)
			this.requestOrder(iapChannel, [productId]).then(order => {
				if (order && order[0]) {
					console.log('orderInfo', {
						manualFinishTransaction: true, //true为手动关闭订单，false为自动关闭订单
						username: orderId, //透传参数
						productid: order[0].productid, //档位id
					})
					uni.requestPayment({
						provider: 'appleiap',
						orderInfo: {
							manualFinishTransaction: true, //true为手动关闭订单，false为自动关闭订单
							username: orderId, //透传参数
							productid: order[0].productid, //档位id
						},
						success: (e) => {
							// console.log('支付成功: ' + JSON.stringify(e));
							resolve(e)
						},
						fail: err => {
							console.log('支付失败1: ' + JSON.stringify(err));
							reject(err)
						}
					})
				} else {
					console.log('订单生成失败: ' + JSON.stringify(order));
					reject(err)
				}
			})
		})
	}
}